home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SCLIB.ARJ / SCL1SAMP.EXE / DATAFLD.C < prev    next >
C/C++ Source or Header  |  1992-01-01  |  7KB  |  256 lines

  1. #include <string.h>
  2. #include <scl1.h>
  3. #include <scl1keys.h>
  4. #include <scl1clor.h>
  5.  
  6. /**************************************************************************
  7.     Shows the use of the Fields2 and FieldCheck functions and how to create
  8.     an user defined field check function.
  9.  
  10.     The data entry field has a Select type field, one LineEditor and two
  11.     mouse buttons.
  12.  
  13.     The field check function will:
  14.  
  15.         1) Check for F1 key to display context sensitive help.
  16.         2) Check if user has selected YES or NO. The LineEditor
  17.            field color is grayed in the case of NO.
  18.         3) Keep the cursor off the LineEditor field if the user has
  19.            selected NO and the LineEditor field is grayed out.
  20.         4) Check before exit if cancel is not selected and YES has been
  21.            selected if the user has fill out the LineEditor field.  */
  22.  
  23. int OurFieldCheck(FData2 *fd2);   /* our CheckF prototype */
  24.  
  25. int Color1=WHITE_BLUE;            /* Colors are initialized */
  26. int Color2=BLACK_CYAN;            /* for a color monitor */
  27. int Color3=BROWN_BLACK+HIGHLIGHT;
  28.  
  29. /* Our first field will be a Select type */
  30.  
  31. SData1 sd1[]={           /* This is Select's first structure */
  32.      11,37,"YES",
  33.      11,47,"NO",
  34.      0};
  35.  
  36. /* Select's secondary structure: */
  37.  
  38. SData2 sd2={23,11,16,"Create backup files:",0,0,0,0};
  39.  
  40. /* Our second field will be a LineEditor type
  41.    This structure defines the LineEditor configuration */
  42.  
  43. LEData led={23,13,16,"Backup Directory:",112,13,34,30,30,
  44.      CC_PATH+CC_CAPITALIZE, 0,0,0,0,0,0,2,1,0,0,0,0,0,0,0};
  45.  
  46. /* The next two fields will be of the MouseButton type. */
  47.  
  48. MBData mb1={23,112,15,28,15,33,15,28,"≡ OK ≡",0,0,0,0};
  49.  
  50. MBData mb2={23,112,15,42,15,51,15,42,"≡ CANCEL ≡",0,0,0,0};
  51.  
  52. FData1 fd1[]={   /* This is the FData1 structure: */
  53.      SELECT,sd1,&sd2,OurFieldCheck,
  54.      LINE_EDITOR,&led,0,OurFieldCheck,
  55.      MOUSE_BUTTON,&mb1,0,OurFieldCheck,
  56.      MOUSE_BUTTON,&mb2,0,OurFieldCheck,
  57.      0};
  58.  
  59. char F1Text[]=" Press F1 for Help ";
  60.  
  61. main()
  62. {
  63. FData2 fd2; /* Fields2 secondary structure */
  64.  
  65. if(Video()==MONO)         /* Verify the type of display and change */
  66.     {                     /* colors if necessary */
  67.     Color1=WHITE_BLACK;
  68.     Color2=BLACK_WHITE;
  69.     Color3=BLACK_WHITE+HIGHLIGHT;
  70.     }
  71.  
  72. /* Clear the screen and draw a box */
  73.  
  74. Cls(Color1,10,13,16,66);
  75. Box(Color1,0,10,13,16,66);
  76.  
  77. WriteScreen(Color1,16,Center(F1Text),F1Text);
  78.  
  79. /* Call Fields2 with a F_INIT message */
  80.  
  81. Fields2(F_INIT,fd1,&fd2);
  82.  
  83. /* allocate buffer for LineEditor field */
  84.  
  85. Fields2(F_ALLOC,fd1,&fd2);
  86.  
  87. /* Tell Fields2 to modify colors to new values */
  88.  
  89. Fields2(F_COLORS,fd1,&fd2,Color1,Color2);
  90.  
  91. /* Draw fields */
  92.  
  93. Fields2(F_DRAW,fd1,&fd2);
  94.  
  95. InitMouse(IM_SHOW);
  96.  
  97. /* Activate, now our CheckF will be in control of program flow */
  98.  
  99. Fields2(F_ACTIVE,fd1,&fd2);
  100.  
  101. /* Check the FData2 structure to see if the user presses ESCAPE
  102.    or selects the CANCEL mouse button for exiting */
  103.  
  104. if(fd2.ActiveField==3 || fd2.EventInfo==ESC)
  105.  
  106.     exit(-1);   /* CANCEL selected */
  107. else
  108.     exit(0);    /* OK selected */
  109. }
  110.  
  111. /* This is the custom field check function */
  112.  
  113. int OurFieldCheck(FData2 *fd2)
  114. {
  115. int Mess;
  116.  
  117. /* Let SCL1 FieldCheck function do most of the work */
  118.  
  119. Mess=FieldCheck(fd2);
  120.  
  121. /* 1) We will watch the F1 help key. It will be reported by Fields2 with an
  122.    ILLEGAL_KEY message in the FData2 EventInfo structure element.*/
  123.  
  124. if(fd2->Message == LE_ILLEGAL_KEY && fd2->EventInfo==F1)
  125.     {
  126.  
  127.     /* display help, fd2->ActiveField = active field number */
  128.  
  129.     Help(fd2->ActiveField);
  130.  
  131.     /* return POSITION_STAY message so that the cursor is not moved
  132.        to another field */
  133.  
  134.     Mess=F_POSITION_STAY;
  135.     }
  136.  
  137. /* 2) Check if the Select field is active and if a S_NEW_POSITION message,
  138.       was send by Select. Thsi message is received each time the user
  139.       changes his selection. We'll check current position to validate
  140.       or invalidate the LineEditor field */
  141.  
  142. else if(fd2->ActiveField==0 && fd2->Message==S_NEW_POSITION)
  143.     {
  144.     if(sd2.Position==0)            /* YES selected */
  145.         {
  146.         led.PColor=Color1;
  147.         led.FColor=Color2;        /* normal colors */
  148.         }
  149.     else
  150.  
  151.     /* NO selected, use gray color */
  152.  
  153.         {
  154.         led.PColor=BLACK_BLUE + HIGHLIGHT;
  155.         led.FColor=BLACK_BLACK + HIGHLIGHT;
  156.         }
  157.  
  158.     LineEditor(LE_DRAW,&led);    /* redraw LineEditor */
  159.     }
  160.  
  161. /* 3) The FIELDSTART message is send each time a new field receives control
  162.    We'll check this message and if the LineEditor field is active we'll
  163.    check its color. If it is set to gray color it means that the user has
  164.    selected not to create backup files. In this case we'll move to the
  165.    next or previous field. By checking the fd2->EventInfo we'll know if
  166.    the user had previously pressed TAB (for the next field) or SHIFT+TAB */
  167.  
  168. else if(fd2->ActiveField==1 && fd2->Message==F_FIELDSTART)
  169.     {
  170.     if(led.FColor==BLACK_BLACK + HIGHLIGHT)
  171.         {
  172.         if(fd2->EventInfo==TAB)
  173.             fd2->ActiveField=2;      /* next field */
  174.         else
  175.             fd2->ActiveField=0;        /* previous field */
  176.         Mess=F_SET_POSITION;
  177.         }
  178.     }
  179.  
  180. /* 4) When the user wants to exit we'll check if a string has been entered
  181.    in the LineEditor field if Select is set to YES and the OK mouse
  182.    button was selected. We know we are about to exit fields when FieldCheck
  183.    returns and F_EXIT message. We'll also check if the key that was
  184.    used to exit was ESCAPE or the CANCEL button was selected, in these
  185.    cases the user has selected to cancel the operation */
  186.  
  187. else if(Mess==F_EXIT && fd2->EventInfo != ESC && fd2->ActiveField != 3)
  188.     {
  189.  
  190.     /* if Select is in YES position and no directory has been entered */
  191.  
  192.     if(sd2.Position==0 && strlen(led.Buffer)==0)
  193.         {
  194.  
  195.         /* display error, change message to POSITION_STAY and move the
  196.         cursor to the LineEditor field */
  197.  
  198.         MessageOn(Color3,"Directory must be entered!");
  199.         Mess=F_POSITION_STAY;
  200.         fd2->ActiveField=1;
  201.         WaitKeyMouse();
  202.         MessageOff();
  203.         }
  204.     }
  205.  
  206.  /* Mess holds the message Fields2 will receive, a POSITION_STAY message
  207.     or the message returned by FieldCheck */
  208.  
  209. return(Mess);
  210. }
  211.  
  212. char AllHelp[]=" TAB-next  SHIFT TAB-previous ";
  213.  
  214. Help(int field)
  215. {
  216.  
  217. /* save cursor status and turn it off */
  218.  
  219. PushCursor();
  220. CursorOff();
  221.  
  222. /* field tells us the field number that is active, we will
  223.    use it to display context sensitive help */
  224.  
  225. switch(field)
  226.     {
  227.     case 0: /* first field */
  228.  
  229.         MessageOn(Color3,"Use arrow keys to select if you\nwant to createbackup files.");
  230.         break;
  231.  
  232.     case 1: /* second field */
  233.  
  234.         MessageOn(Color3,"Type Backup files directory.");
  235.         break;
  236.  
  237.     case 2: /* third field */
  238.  
  239.         MessageOn(Color3,"Press ENTER to validate\nyour selection.");
  240.         break;
  241.  
  242.     case 3: /* fourth field */
  243.  
  244.         MessageOn(Color3,"Press ENTER or ESC to\ncancel your selection.");
  245.         break;
  246.     }
  247.  
  248. WriteScreen(Color3,12,Center(AllHelp),AllHelp);
  249.  
  250.  /* wait for mouse or keystroke, remove message, restore cursor */
  251.  
  252. WaitKeyMouse();
  253. MessageOff();
  254. PopCursor();
  255. }
  256.